class Container{
	static of(value){
		return new Container(value);
	}
	constructor(value){
		this._value = value
	}
	map(fn){
		return Container.of(fn(this._value))
	}
}

class Maybe{
	static of(x){
		return new Maybe(x)
	}
	isNothing(){
		return this._value === null ||
		this._value === undefined
	}
	constructor(x){
		this._value = x
	}
	map(fn){
		return this.isNothing() ? this:Maybe.of(fn(this._value))
	}
}
////////////////////////////////
 module.exports = {Maybe,Container}
 const fp = require('lodash/fp');
 let maybe = Maybe.of([5,6,1])
 let ex1 = fp.map(fp.add(1))
 console.log(maybe.map(ex1))
 
 //////////////////////////////
 
let xs = Container.of(['do','ray','me','fa','so','la','ti','do']);
 let ex2 = fp.first
 console.log(xs.map(ex2))
 
 
 /////////////
 let safeprop = fp.curry(function(x,o){
	 return Maybe.of(o[x])
 })
 let user = {id:2,name:'Albert'}
 let ex3 = () => safeprop('name',user).map(fp.first);
 
 console.log(ex3())
 
 ////////////////////////////////
 
 let ex4 = n => Maybe.of(n).map(parseInt)
 
 console.log(ex4('88l'))
 
 //paran
 
 